package com.googlecode.lemyriapode.prgechecs.univers;

public class Domaine {

    public static int minX = 1;
    public static int maxX = 8;
    public static int minY = 1;
    public static int maxY = 8;
    public static Point Origine;
    public Obstacle obstacle;

    public Domaine() {
        new Vecteur();
        obstacle = new Obstacle();
        Origine = new Point(1, 1);
    }

    public static class Vecteur {

        int u, v;
        static Vecteur nord, sud, est, ouest;
        static Vecteur nord_est, sud_est, nord_ouest, sud_ouest;
        static Vecteur[] Direction;

        public Vecteur() {
            nord = new Vecteur(1, 0);
            sud = new Vecteur(-1, 0);
            est = new Vecteur(0, 1);
            ouest = new Vecteur(0, -1);

            nord_est = nord.plus(est);
            sud_est = sud.plus(est);
            nord_ouest = nord.plus(ouest);
            sud_ouest = sud.plus(ouest);

            Direction = new Vecteur[ 8 ];
            Direction[0] = nord;
            Direction[1] = nord_est;
            Direction[2] = est;
            Direction[3] = sud_est;
            Direction[4] = sud;
            Direction[5] = sud_ouest;
            Direction[6] = ouest;
            Direction[7] = nord_ouest;
        }

        public Vecteur(int u, int v) {
            this.u = u;
            this.v = v;
        }

        public Vecteur plus(Vecteur vect) {
            return new Vecteur(u + vect.u, v + vect.v);
        }

        @Override
        public String toString() {
            return this.getClass().getSimpleName();
        }
    }

    public class Point {

        int X, Y;

        public Point(int X, int Y) {

            this.X = X;
            this.Y = Y;
        }

        @Override
        public String toString() {
            return "(" + X + "," + Y + ")";
        }

        public Point copy() throws CloneNotSupportedException {
            return new Point(this.X, this.Y);
        }

        @Override
        public boolean equals(Object objet) {
            if (objet == this) {
                return true;
            }
            if (objet instanceof Point) {
                Point p = (Point) objet;
                if ((X != p.X) | (Y != p.Y)) {
                    return false;
                } else {
                    return true;
                }
            }

            return false;
        }

        @Override
        public int hashCode() {
            int hash = 7;
            hash = 53 * hash + this.X;
            hash = 53 * hash + this.Y;
            return hash;
        }
    }

    public void ajoutObstacle(int X, int Y, String type, boolean couleur) {
        obstacle.addType(X, Y, type, couleur);
    }

    public class Obstacle {

        private TypeObstacle[][] LEtats;

        private void addType(int X, int Y, String type, boolean couleur) {

            LEtats[X][Y] = new TypeObstacle(X, Y, type, couleur);

        }

        public class TypeObstacle {

            private String Nom;
            private boolean Couleur;

            private TypeObstacle(int X, int Y, String type, boolean couleur) {
                Couleur = couleur;
               
                    Nom = couleur ? "w" : "b";
                    Nom += type.charAt(0);
                    Nom += estCaseCouleur(X, Y) ? "w" : "b";
                
            }

            public boolean estBlanc() {
                return Couleur;
            }

            public boolean Etat() {
                return Couleur;
            }

            public String getNom() {
                return Nom;
            }

            private boolean estCaseCouleur(int X, int Y) {
                if (X % 2 == 0) {
                    if (Y % 2 == 0) {
                        return false;
                    } else {
                        return true;
                    }
                } else {
                    if (Y % 2 == 0) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
        }

        public Obstacle() {
            LEtats = new TypeObstacle[ maxX + 1 ][ maxY + 1 ];
        }

        public Obstacle(TypeObstacle[][] liste) {
            this.LEtats = liste;
        }

        public TypeObstacle[][] getListe() {
            return LEtats;
        }
    }
}
